home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 37 / IOPROG_37.ISO / SOFT / Multilizer.exe / disk1 / data1.cab / data1 / [Group9]VCL Source Standard / ivmlread.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-12  |  18.3 KB  |  713 lines

  1. unit IvMlRead;
  2.  
  3. {$I IVMULTI.INC}
  4.  
  5. interface
  6.  
  7. uses
  8. {$IFDEF WIN32}
  9.   Windows,
  10. {$ELSE}
  11.   WinTypes, WinProcs,
  12. {$ENDIF}
  13.   SysUtils, Classes,
  14.   IvParser, IvDictio, IvAMulti;
  15.  
  16. const
  17.   LANGUAGES_VERSION_C = 2;
  18.   TRANSLATIONS_VERSION_C = 2;
  19.   LOCALES_VERSION_C = 2;
  20.  
  21.   LANGUAGES_C = 'Languages';
  22.   LOCALES_C = 'Locales';
  23.   TRANSLATIONS_C = 'Translations';
  24.  
  25. type
  26.   TIvReader = class(TReader)
  27.   protected
  28.     procedure SkipSetBody;
  29.     procedure SkipValue;
  30.     procedure SkipProperty;
  31.     procedure SkipComponentHeader;
  32.     procedure SkipComponentBody;
  33.     procedure SkipComponent;
  34. {$IFNDEF WIN32}
  35.     function ReadValue: TValueType;
  36. {$ENDIF}
  37. {$IFDEF WIN32}
  38.     function ReadLongString: String;
  39. {$ENDIF}
  40.  
  41.   public
  42.     procedure FindPropertyData(const componentClass, componentName, propertyName: String);
  43.  
  44.     class procedure ReadLanguage(reader: TReader; language: TIvLanguage; version: Integer);
  45.     class procedure WriteLanguage(writer: TWriter; language: TIvLanguage);
  46.  
  47.     class procedure ReadLocale(reader: TReader; locale: TIvLocale; version: Integer);
  48.     class procedure WriteLocale(writer: TWriter; locale: TIvLocale);
  49.  
  50.     class function SkipLanguages(reader: TReader): Integer;
  51.     class function SkipTranslations(reader: TReader; languageCount: Integer): Integer;
  52.     class function SkipLocales(reader: TReader): Integer;
  53.  
  54.     class procedure GetLanguageData(
  55.       const resName, className, name: String;
  56.       index: Integer;
  57.       language: TIvLanguage);
  58.  
  59.     class procedure GetLanguageDatas(
  60.       const resName, className, name: String;
  61.       languages: TList);
  62.  
  63.     class procedure DoGetLanguageDatas(reader: TReader; languages: TList);
  64.  
  65.     class procedure GetLocaleData(
  66.       const resName, className, name: String;
  67.       index: Integer;
  68.       locale: TIvLocale);
  69.  
  70.     class procedure GetLocaleDatas(
  71.       const resName, className, name: String;
  72.       locales: TList);
  73.  
  74.     class procedure DoGetLocaleDatas(reader: TReader; locales: TList);
  75.  
  76.     class function LoadTranslation(
  77.       const resName, className, name: String;
  78.       language, languageCount: Integer;
  79.       translations: TList): TIvContextType;
  80.  
  81.     class function DoLoadTranslation(
  82.       reader: TReader;
  83.       language, languageCount: Integer;
  84.       translations: TList): TIvContextType;
  85.   end;
  86.  
  87. implementation
  88.  
  89. var
  90.   stream: TStream;
  91.   reader: TIvReader;
  92. {$IFNDEF WIN32}
  93.   resInfo: THandle;
  94.   handle: Integer;
  95. {$ENDIF}
  96.  
  97. procedure OpenReader(const resName, className, name, dataName: String);
  98. {$IFNDEF WIN32}
  99. var
  100.   buffer: array[0..255] of Char;
  101. {$ENDIF}
  102. begin
  103. {$IFDEF WIN32}
  104.   stream := TResourceStream.Create(HInstance, resName, RT_RCDATA);
  105. {$ELSE}
  106.   resInfo := FindResource(HInstance, StrPCopy(buffer, resName), RT_RCDATA);
  107.   handle := AccessResource(HInstance, resInfo);
  108.   stream := THandleStream.Create(handle);
  109. {$ENDIF}
  110.   try
  111.     reader := TIvReader.Create(stream, 4096);
  112.     try
  113.       reader.FindPropertyData(className, name, dataName);
  114.     except
  115.       reader.Free;
  116.       raise;
  117.     end;
  118.   except
  119.     stream.Free;
  120. {$IFNDEF WIN32}
  121.     FileClose(handle);
  122. {$ENDIF}
  123.     raise;
  124.   end;
  125. end;
  126.  
  127. procedure CloseReader;
  128. begin
  129.   reader.Free;
  130.   stream.Free;
  131. {$IFNDEF WIN32}
  132.   FileClose(handle);
  133. {$ENDIF}
  134. end;
  135.  
  136. procedure TIvReader.SkipSetBody;
  137. begin
  138.   while ReadStr <> '' do
  139.   begin
  140.   end;
  141. end;
  142.  
  143. procedure TIvReader.SkipValue;
  144.  
  145.   procedure SkipList;
  146.   begin
  147.     while not EndOfList do
  148.       SkipValue;
  149.     ReadListEnd;
  150.   end;
  151.  
  152.   procedure SkipBytes(Count: Longint);
  153.   var
  154.     Bytes: array[0..255] of Char;
  155.   begin
  156.     while Count > 0 do
  157.       if Count > SizeOf(Bytes) then
  158.       begin
  159.         Read(Bytes, SizeOf(Bytes));
  160.         Dec(Count, SizeOf(Bytes));
  161.       end
  162.       else
  163.       begin
  164.         Read(Bytes, Count);
  165.         Count := 0;
  166.       end;
  167.   end;
  168.  
  169.   procedure SkipBinary;
  170.   var
  171.     Count: Longint;
  172.   begin
  173.     Read(Count, SizeOf(Count));
  174.     SkipBytes(Count);
  175.   end;
  176.  
  177. {$IFDEF WIN32}
  178.   procedure SkipCollection;
  179.   begin
  180.     while not EndOfList do
  181.     begin
  182.       if NextValue in [vaInt8, vaInt16, vaInt32] then
  183.         SkipValue;
  184.       SkipBytes(1);
  185.       while not EndOfList do
  186.         SkipProperty;
  187.       ReadListEnd;
  188.     end;
  189.     ReadListEnd;
  190.   end;
  191. {$ENDIF}
  192.  
  193. begin
  194.   case ReadValue of
  195.     vaNull: ;
  196.     vaList: SkipList;
  197.     vaInt8: SkipBytes(1);
  198.     vaInt16: SkipBytes(2);
  199.     vaInt32: SkipBytes(4);
  200.     vaExtended: SkipBytes(SizeOf(Extended));
  201.     vaString, vaIdent: ReadStr;
  202.     vaFalse, vaTrue: ;
  203.     vaBinary: SkipBinary;
  204.     vaSet: SkipSetBody;
  205. {$IFDEF WIN32}
  206.     vaLString: ReadLongString;
  207.     vaNil: ;
  208.     vaCollection: SkipCollection;
  209. {$ENDIF}
  210.   end;
  211. end;
  212.  
  213. {$IFDEF WIN32}
  214. function TIvReader.ReadLongString: String;
  215. var
  216.   L: Integer;
  217. begin
  218.   Read(L, SizeOf(Integer));
  219.   SetString(Result, PChar(nil), L);
  220.   Read(Pointer(Result)^, L);
  221. end;
  222. {$ENDIF}
  223.  
  224. procedure TIvReader.SkipProperty;
  225. var
  226.   str: String;
  227. begin
  228.   str := ReadStr; { Skips property name }
  229.   SkipValue;
  230. end;
  231.  
  232. procedure TIvReader.SkipComponentHeader;
  233. {$IFDEF WIN32}
  234. var
  235.   flags: TFilerFlags;
  236.   position: Integer;
  237. {$ENDIF}
  238. begin
  239. {$IFDEF WIN32}
  240.   ReadPrefix(flags, position);
  241. {$ENDIF}
  242.   ReadStr;
  243.   ReadStr;
  244. end;
  245.  
  246. procedure TIvReader.SkipComponentBody;
  247. begin
  248.   while not EndOfList do
  249.     SkipProperty;
  250.   ReadListEnd;
  251.   while not EndOfList do
  252.     SkipComponent;
  253.   ReadListEnd;
  254. end;
  255.  
  256. procedure TIvReader.SkipComponent;
  257. begin
  258.   SkipComponentHeader;
  259.   SkipComponentBody;
  260. end;
  261.  
  262. {$IFNDEF WIN32}
  263. function TIvReader.ReadValue: TValueType;
  264. begin
  265.   Read(Result, SizeOf(Result));
  266. end;
  267. {$ENDIF}
  268.  
  269. procedure TIvReader.FindPropertyData(const componentClass, componentName, propertyName: String);
  270. var
  271. {$IFDEF WIN32}
  272.   flags: TFilerFlags;
  273.   position: Integer;
  274. {$ENDIF}
  275.   compClass, compName, propName: String;
  276. begin
  277.   ReadSignature;
  278. {$IFDEF WIN32}
  279.   ReadPrefix(flags, position);
  280. {$ENDIF}
  281.   ReadStr;
  282.   ReadStr;
  283.   while not EndOfList do
  284.     SkipProperty;
  285.   ReadListEnd;
  286.   while not EndOfList do
  287.   begin
  288. {$IFDEF WIN32}
  289.     ReadPrefix(flags, position);
  290. {$ENDIF}
  291.     compClass := ReadStr;
  292.     compName := ReadStr;
  293.     if (compClass <> componentClass) or (compName <> componentName) then
  294.       SkipComponentBody
  295.     else
  296.     begin
  297.       while not EndOfList do
  298.       begin
  299.         propName := ReadStr;
  300.         if propName <> propertyName then
  301.           SkipValue
  302.         else
  303.           Exit;
  304.       end;
  305.       raise EResNotFound.Create('Could not find the property');
  306.     end;
  307.   end;
  308.   raise EResNotFound.Create('Could not find the property');
  309. end;
  310.  
  311. class procedure TIvReader.ReadLanguage(reader: TReader; language: TIvLanguage; version: Integer);
  312. begin
  313.   reader.ReadListBegin;
  314.  
  315.   language.Primary := reader.ReadInteger;
  316.   language.AllSubs := reader.ReadString;
  317.   language.DefaultSub := reader.ReadInteger;
  318.   if version >= 2 then
  319.     {$IFDEF WIN32}language.Charset := {$ENDIF}reader.ReadInteger;
  320.   language.CodePage := reader.ReadInteger;
  321.  
  322.   language.EnglishName := reader.ReadString;
  323.   language.NativeName := reader.ReadString;
  324.   language.FontName := reader.ReadString;
  325.   language.FontSize := reader.ReadInteger;
  326.  
  327.   language.Options := [];
  328.   if reader.ReadBoolean then
  329.     language.Options := language.Options + [ivloTest];
  330.   if reader.ReadBoolean then
  331.     language.Options := language.Options + [ivloPureASCII];
  332.  
  333.   language.Init;
  334.  
  335.   reader.ReadListEnd;
  336. end;
  337.  
  338. class procedure TIvReader.WriteLanguage(writer: TWriter; language: TIvLanguage);
  339. begin
  340.   writer.WriteListBegin;
  341.  
  342.   writer.WriteInteger(language.Primary);
  343.   writer.WriteString(language.AllSubs);
  344.   writer.WriteInteger(language.DefaultSub);
  345. {$IFDEF WIN32}
  346.   writer.WriteInteger(language.Charset);
  347. {$ELSE}
  348.   writer.WriteInteger(0);
  349. {$ENDIF}
  350.   writer.WriteInteger(language.CodePage);
  351.  
  352.   writer.WriteString(language.EnglishName);
  353.   writer.WriteString(language.NativeName);
  354.   writer.WriteString(language.FontName);
  355.   writer.WriteInteger(language.FontSize);
  356.  
  357.   writer.WriteBoolean(ivloTest in language.Options);
  358.   writer.WriteBoolean(ivloPureASCII in language.Options);
  359.  
  360.   writer.WriteListEnd;
  361. end;
  362.  
  363. class procedure TIvReader.ReadLocale(reader: TReader; locale: TIvLocale; version: Integer);
  364. var
  365.   i: Integer;
  366. begin
  367.   reader.ReadListBegin;
  368.  
  369.   locale.Primary := reader.ReadInteger;
  370.   locale.Sub := reader.ReadInteger;
  371.   if version >= 2 then
  372.     {$IFDEF WIN32}locale.Charset := {$ENDIF}reader.ReadInteger;
  373.   locale.CodePage := reader.ReadInteger;
  374.   locale.IsCustom := reader.ReadBoolean;
  375.  
  376.   locale.EnglishLanguageName := reader.ReadString;
  377.   locale.EnglishCountryName := reader.ReadString;
  378.   locale.NativeLanguageName := reader.ReadString;
  379.   locale.NativeCountryName := reader.ReadString;
  380.   locale.Win16LanguageName := reader.ReadString;
  381.   locale.Win16CountryName := reader.ReadString;
  382.  
  383.   locale.MeasurementSystem := TIvMeasurementSystem(reader.ReadInteger);
  384.   locale.CurrencyString := reader.ReadString;
  385.   locale.CurrencyFormat := TIvCurrencyFormat(reader.ReadInteger);
  386.   locale.NegCurrFormat := TIvNegativeCurrencyFormat(reader.ReadInteger);
  387.   locale.CurrencyDecimals := reader.ReadInteger;
  388.   locale.ThousandSeparator := reader.ReadChar;
  389.   locale.DecimalSeparator := reader.ReadChar;
  390.  
  391.   locale.DateSeparator := reader.ReadChar;
  392.   locale.ShortDateFormat := reader.ReadString;
  393.   locale.LongDateFormat := reader.ReadString;
  394.  
  395.   locale.TimeSeparator := reader.ReadChar;
  396.   locale.TimeAMString := reader.ReadString;
  397.   locale.TimePMString := reader.ReadString;
  398.   locale.TimeLeadingZeros := reader.ReadBoolean;
  399.   locale.TimeFormat := TIvTimeFormat(reader.ReadInteger);
  400.   locale.TimeMarkPosition := TIvTimeMarkPosition(reader.ReadInteger);
  401.  
  402.   locale.CalendarType := TIvCalendarType(reader.ReadInteger);
  403.   locale.OptionalCalendarType := TIvCalendarType(reader.ReadInteger);
  404.   locale.FirstDayOfWeek := TIvDayOfWeek(reader.ReadInteger);
  405.   locale.FirstWeekOfYear := TIvFirstWeekOfYear(reader.ReadInteger);
  406.  
  407.   for i := 1 to 12 do
  408.     locale.ShortMonthNames[i] := reader.ReadString;
  409.   for i := 1 to 12 do
  410.     locale.LongMonthNames[i] := reader.ReadString;
  411.   for i := 1 to 7 do
  412.     locale.ShortDayNames[i] := reader.ReadString;
  413.   for i := 1 to 7 do
  414.     locale.LongDayNames[i] := reader.ReadString;
  415.  
  416.   locale.Init;
  417.  
  418.   reader.ReadListEnd;
  419. end;
  420.  
  421. class procedure TIvReader.WriteLocale(writer: TWriter; locale: TIvLocale);
  422. var
  423.   i: Integer;
  424. begin
  425.   writer.WriteListBegin;
  426.  
  427.   writer.WriteInteger(locale.Primary);
  428.   writer.WriteInteger(locale.Sub);
  429. {$IFDEF WIN32}
  430.   writer.WriteInteger(locale.Charset);
  431. {$ELSE}
  432.   writer.WriteInteger(0);
  433. {$ENDIF}
  434.   writer.WriteInteger(locale.CodePage);
  435.   writer.WriteBoolean(locale.IsCustom);
  436.  
  437.   writer.WriteString(locale.EnglishLanguageName);
  438.   writer.WriteString(locale.EnglishCountryName);
  439.   writer.WriteString(locale.NativeLanguageName);
  440.   writer.WriteString(locale.NativeCountryName);
  441.   writer.WriteString(locale.Win16LanguageName);
  442.   writer.WriteString(locale.Win16CountryName);
  443.  
  444.   writer.WriteInteger(Integer(locale.MeasurementSystem));
  445.   writer.WriteString(locale.CurrencyString);
  446.   writer.WriteInteger(Integer(locale.CurrencyFormat));
  447.   writer.WriteInteger(Integer(locale.NegCurrFormat));
  448.   writer.WriteInteger(locale.CurrencyDecimals);
  449.   writer.WriteChar(locale.ThousandSeparator);
  450.   writer.WriteChar(locale.DecimalSeparator);
  451.  
  452.   writer.WriteChar(locale.DateSeparator);
  453.   writer.WriteString(locale.ShortDateFormat);
  454.   writer.WriteString(locale.LongDateFormat);
  455.  
  456.   writer.WriteChar(locale.TimeSeparator);
  457.   writer.WriteString(locale.TimeAMString);
  458.   writer.WriteString(locale.TimePMString);
  459.   writer.WriteBoolean(locale.TimeLeadingZeros);
  460.   writer.WriteInteger(Integer(locale.TimeFormat));
  461.   writer.WriteInteger(Integer(locale.TimeMarkPosition));
  462.  
  463.   writer.WriteInteger(Integer(locale.CalendarType));
  464.   writer.WriteInteger(Integer(locale.OptionalCalendarType));
  465.   writer.WriteInteger(Integer(locale.FirstDayOfWeek));
  466.   writer.WriteInteger(Integer(locale.FirstWeekOfYear));
  467.  
  468.   for i := 1 to 12 do
  469.     writer.WriteString(locale.ShortMonthNames[i]);
  470.   for i := 1 to 12 do
  471.     writer.WriteString(locale.LongMonthNames[i]);
  472.   for i := 1 to 7 do
  473.     writer.WriteString(locale.ShortDayNames[i]);
  474.   for i := 1 to 7 do
  475.     writer.WriteString(locale.LongDayNames[i]);
  476.  
  477.   writer.WriteListEnd;
  478. end;
  479.  
  480. class function TIvReader.SkipLanguages(reader: TReader): Integer;
  481. var
  482.   i, version: Integer;
  483.   language: TIvLanguage;
  484. begin
  485.   reader.ReadListBegin;
  486.   version := reader.ReadInteger;
  487.   if version > LANGUAGES_VERSION_C then
  488.     raise Exception.Create('Unknown language data version: ' + IntToStr(version));
  489.   Result := reader.ReadInteger;
  490.   for i := 0 to Result - 1 do
  491.   begin
  492.     language := TIvLanguage.Create;
  493.     TIvReader.ReadLanguage(reader, language, version);
  494.     language.Free;
  495.   end;
  496.   reader.ReadListEnd;
  497. end;
  498.  
  499. class function TIvReader.SkipTranslations(reader: TReader; languageCount: Integer): Integer;
  500. var
  501.   i, j, version: Integer;
  502.   format: TIvDictionaryFormat;
  503. begin
  504.   reader.ReadListBegin;
  505.   version := reader.ReadInteger;
  506.   if version > TRANSLATIONS_VERSION_C then
  507.     raise Exception.Create('Unknown translation data version: ' + IntToStr(version));
  508.   if version >= 2 then
  509.     format := TIvDictionaryFormat(reader.ReadInteger)
  510.   else
  511.     format := ivdfFlat;
  512.   Result := reader.ReadInteger;
  513.   for i := 0 to Result - 1 do
  514.   begin
  515.     reader.ReadListBegin;
  516.     for j := 0 to languageCount - 1 do
  517.     begin
  518.       reader.ReadString;
  519.       if (j = 0) and (format = ivdfContext) then
  520.       begin
  521.         reader.ReadString;
  522.         reader.ReadString;
  523.       end;
  524.     end;
  525.     reader.ReadListEnd;
  526.   end;
  527.   reader.ReadListEnd;
  528. end;
  529.  
  530. class function TIvReader.SkipLocales(reader: TReader): Integer;
  531. var
  532.   i, version: Integer;
  533.   locale: TIvLocale;
  534. begin
  535.   reader.ReadListBegin;
  536.   version := reader.ReadInteger;
  537.   if version > LOCALES_VERSION_C then
  538.     raise Exception.Create('Unknown locale data version: ' + IntToStr(version));
  539.   Result := reader.ReadInteger;
  540.   for i := 0 to Result - 1 do
  541.   begin
  542.     locale := TIvLocale.Create;
  543.     TIvReader.ReadLocale(reader, locale, version);
  544.     locale.Free;
  545.   end;
  546.   reader.ReadListEnd;
  547. end;
  548.  
  549. class procedure TIvReader.GetLanguageData(
  550.   const resName, className, name: String;
  551.   index: Integer;
  552.   language: TIvLanguage);
  553. var
  554.   i, version: Longint;
  555. begin
  556.   OpenReader(resName, className, name, LANGUAGES_C);
  557.   try
  558.     reader.ReadListBegin;
  559.     version := reader.ReadInteger;
  560.     if version > LANGUAGES_VERSION_C then
  561.       raise Exception.Create('Unknown language data version: ' + IntToStr(version));
  562.     reader.ReadInteger;
  563.     for i := 0 to index do
  564.       TIvReader.ReadLanguage(reader, language, version);
  565.   finally
  566.     CloseReader;
  567.   end;
  568. end;
  569.  
  570. class procedure TIvReader.GetLanguageDatas(
  571.   const resName, className, name: String;
  572.   languages: TList);
  573. begin
  574.   OpenReader(resName, className, name, LANGUAGES_C);
  575.   try
  576.     DoGetLanguageDatas(reader, languages);
  577.   finally
  578.     CloseReader;
  579.   end;
  580. end;
  581.  
  582. class procedure TIvReader.DoGetLanguageDatas(reader: TReader; languages: TList);
  583. var
  584.   i, version: Longint;
  585.   language: TIvLanguage;
  586. begin
  587.   reader.ReadListBegin;
  588.   version := reader.ReadInteger;
  589.   if version > LANGUAGES_VERSION_C then
  590.      raise Exception.Create('Unknown language data version: ' + IntToStr(version));
  591.   for i := 0 to reader.ReadInteger - 1 do
  592.   begin
  593.      language := TIvLanguage.Create;
  594.      TIvReader.ReadLanguage(reader, language, version);
  595.      languages.Add(language)
  596.   end;
  597.   reader.ReadListEnd;
  598. end;
  599.  
  600. class procedure TIvReader.GetLocaleData(
  601.   const resName, className, name: String;
  602.   index: Integer;
  603.   locale: TIvLocale);
  604. var
  605.   i, version: Longint;
  606. begin
  607.   OpenReader(resName, className, name, LOCALES_C);
  608.   try
  609.     reader.ReadListBegin;
  610.     version := reader.ReadInteger;
  611.     if version > LOCALES_VERSION_C then
  612.       raise Exception.Create('Unknown locale data version: ' + IntToStr(version));
  613.     reader.ReadInteger;
  614.     for i := 0 to index do
  615.       TIvReader.ReadLocale(reader, locale, version);
  616.   finally
  617.     CloseReader;
  618.   end;
  619. end;
  620.  
  621. class procedure TIvReader.GetLocaleDatas(
  622.   const resName, className, name: String;
  623.   locales: TList);
  624. begin
  625.   OpenReader(resName, className, name, LOCALES_C);
  626.   try
  627.     DoGetLocaleDatas(reader, locales);
  628.   finally
  629.     CloseReader;
  630.   end;
  631. end;
  632.  
  633. class procedure TIvReader.DoGetLocaleDatas(reader: TReader; locales: TList);
  634. var
  635.   i, version: Longint;
  636.   locale: TIvLocale;
  637. begin
  638.   reader.ReadListBegin;
  639.   version := reader.ReadInteger;
  640.   if version > LOCALES_VERSION_C then
  641.      raise Exception.Create('Unknown locale data version: ' + IntToStr(version));
  642.   for i := 0 to reader.ReadInteger - 1 do
  643.   begin
  644.      locale := TIvLocale.Create;
  645.      TIvReader.ReadLocale(reader, locale, version);
  646.      locales.Add(locale)
  647.   end;
  648.   reader.ReadListEnd;
  649. end;
  650.  
  651. class function TIvReader.LoadTranslation(
  652.   const resName, className, name: String;
  653.   language, languageCount: Integer;
  654.   translations: TList): TIvContextType;
  655. begin
  656.   OpenReader(resName, className, name, TRANSLATIONS_C);
  657.   try
  658.     Result := DoLoadTranslation(reader, language, languageCount, translations);
  659.   finally
  660.     CloseReader;
  661.   end;
  662. end;
  663.  
  664. class function TIvReader.DoLoadTranslation(
  665.   reader: TReader;
  666.   language, languageCount: Integer;
  667.   translations: TList): TIvContextType;
  668. var
  669.   str: String;
  670.   i, j, version: Longint;
  671.   translation: TIvTranslation;
  672. begin
  673.   reader.ReadListBegin;
  674.   version := reader.ReadInteger;
  675.   if version > TRANSLATIONS_VERSION_C then
  676.     raise Exception.Create('Unknown translation data version: ' + IntToStr(version));
  677.  
  678.   if version >= 2 then
  679.     Result := TIvContext.ContextCodeToType(TIvContextCode(reader.ReadInteger))
  680.   else
  681.     Result := [];
  682.  
  683.   for i := 0 to reader.ReadInteger - 1 do
  684.   begin
  685.     translation := TIvTranslation.Create;
  686.     reader.ReadListBegin;
  687.  
  688.     translation.Str := reader.ReadString;
  689.  
  690.     if ivctForm in Result then
  691.       translation.Form := reader.ReadString;
  692.     if ivctComponent in Result then
  693.       translation.Component := reader.ReadString;
  694.  
  695.     if Language = 0 then
  696.       translation.Current := translation.Str;
  697.  
  698.     for j := 1 to languageCount - 1 do
  699.     begin
  700.       str := reader.ReadString;
  701.       if j = language then
  702.         translation.Current := str;
  703.     end;
  704.  
  705.     reader.ReadListEnd;
  706.     translations.Add(translation);
  707.   end;
  708.   reader.ReadListEnd;
  709. end;
  710.  
  711. end.
  712.  
  713.